/**
 * 日期处理工具模块
 * 
 * 本模块提供了一组用于处理和格式化日期的简洁实用函数。
 * 基于dayjs库实现，提供了日期格式化、相对时间计算等常用功能。
 * 
 * 主要功能：
 * - 日期时间格式化（年月日时分秒）
 * - 仅日期格式化（年月日）
 * - 相对时间计算（如"3小时前"）
 * - 智能时间显示（近期用相对时间，较早用格式化日期）
 * 
 * 本模块作为轻量级的日期工具补充，适用于简单的日期处理场景。
 * 对于更复杂的日期操作，请使用 dateUtils.ts 中的更全面的功能。
 * 
 * @module utils/date
 */
import dayjs from 'dayjs'; // 导入dayjs日期处理库

/**
 * 格式化日期时间
 * 将日期转换为指定格式的字符串表示
 * 
 * @param date 日期字符串或Date对象
 * @param format 格式化字符串，默认为'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串，无效日期返回空字符串
 */
export const formatDateTime = (date: string | Date, format: string = 'YYYY-MM-DD HH:mm:ss'): string => {
  if (!date) return ''; // 空值处理
  return dayjs(date).format(format); // 使用dayjs格式化日期
};

/**
 * 格式化日期
 * 将日期转换为年月日格式的字符串表示，不包含时间部分
 * 
 * @param date 日期字符串或Date对象
 * @param format 格式化字符串，默认为'YYYY-MM-DD'
 * @returns 格式化后的日期字符串，无效日期返回空字符串
 */
export const formatDate = (date: string | Date, format: string = 'YYYY-MM-DD'): string => {
  if (!date) return ''; // 空值处理
  return dayjs(date).format(format); // 使用dayjs格式化日期
};

/**
 * 获取相对时间描述
 * 计算给定日期与当前时间的差距，并转换为友好的文本描述
 * 
 * @param date 日期字符串或Date对象
 * @returns 相对时间描述，如"刚刚"、"3分钟前"、"2小时前"等
 */
export const getRelativeTime = (date: string | Date): string => {
  if (!date) return ''; // 空值处理
  
  const now = dayjs(); // 当前时间
  const target = dayjs(date); // 目标时间
  
  // 计算时间差（分钟）
  const diffMinutes = now.diff(target, 'minute');
  
  // 不到1分钟，显示"刚刚"
  if (diffMinutes < 1) return '刚刚';
  
  // 不到1小时，显示"x分钟前"
  if (diffMinutes < 60) return `${diffMinutes}分钟前`;
  
  // 计算时间差（小时）
  const diffHours = now.diff(target, 'hour');
  
  // 不到1天，显示"x小时前"
  if (diffHours < 24) return `${diffHours}小时前`;
  
  // 计算时间差（天）
  const diffDays = now.diff(target, 'day');
  
  // 不到1个月，显示"x天前"
  if (diffDays < 30) return `${diffDays}天前`;
  
  // 计算时间差（月）
  const diffMonths = now.diff(target, 'month');
  
  // 不到1年，显示"x个月前"
  if (diffMonths < 12) return `${diffMonths}个月前`;
  
  // 超过1年，显示"x年前"
  return `${now.diff(target, 'year')}年前`;
};

/**
 * 智能格式化时间
 * 根据日期的新近程度自动选择显示方式：
 * - 最近7天内的日期显示为相对时间（如"3小时前"）
 * - 更早的日期显示为完整的日期时间格式
 * 
 * 适用于新闻列表、评论等需要智能时间显示的场景
 * 
 * @param date 日期字符串或Date对象
 * @returns 处理后的时间字符串
 */
export const formatTimeAgo = (date: string | Date): string => {
  if (!date) return ''; // 空值处理
  
  const now = dayjs(); // 当前时间
  const target = dayjs(date); // 目标时间
  
  // 计算相差的天数
  const diffDays = now.diff(target, 'day');
  
  // 如果在7天之内，使用相对时间
  if (diffDays < 7) {
    return getRelativeTime(date); // 调用相对时间函数
  }
  
  // 超过7天，使用完整的日期时间格式
  return formatDateTime(date); // 调用日期时间格式化函数
};

/**
 * 默认导出所有日期处理函数
 */
export default {
  formatDateTime, // 格式化日期时间
  formatDate,     // 格式化日期
  getRelativeTime, // 获取相对时间
  formatTimeAgo  // 智能格式化时间
}; 